#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <unistd.h>  
#include <termios.h>  
 
struct termios newtio,oldtio;  
 
int main(int argc , char ** argv)
{  
 	int fd;
    int nset,nread;  
 
 	char buf1[100] = {0};  
 	char *filename;
 
     /*1.参数校验*/
	if(argc !=2)
	{
		printf("输入错误!!!\r\n");	
		printf("请向终端输入: ./uartApp  /dev/ttymxc2  \r\n");
		return -1;
	}
 
 	filename = argv[1];
 
    fd = open( filename, O_RDWR);  
    if (fd == -1) 
	{
		printf("打开执行文件 %s 错误\r\n",filename);
		exit(1);  
	}		
    printf("打开执行文件  %s  成功!!\n",filename);  
 
 
    /*初始化串口*/
    //获取串口属性 将属性保存在oldtio结构体中
    if ( tcgetattr( fd,&oldtio)  !=  0)
    {  
        perror("获取终端失败");  
        exit(1);  
    }  
    
    //将该结构体清零
    bzero( &newtio, sizeof( newtio ) );  
 
    newtio.c_cflag  |=  CLOCAL | CREAD; //CLOCAL:忽略modem控制线  CREAD：打开接受  
    newtio.c_cflag &= ~CSIZE;     
    newtio.c_cflag |= CS8;  //字符长度掩码。取值为：CS5，CS6，CS7或CS8  
    newtio.c_cflag &= ~PARENB;//关闭奇偶校验  
    newtio.c_cflag &=  ~CSTOPB;   //停止位设置
 
    //波特率设置
    cfsetispeed(&newtio, B115200);  
    cfsetospeed(&newtio, B115200);  
 
    newtio.c_cc[VTIME]  = 0; //VTIME:非cannoical模式读时的延时，以十分之一秒位单位  
    newtio.c_cc[VMIN] = 0; //VMIN:非canonical模式读到最小字符数  
    tcflush(fd,TCIFLUSH); // 改变在所有写入 fd 引用的对象的输出都被传输后生效，所有已接受但未读入的输入都在改变发生前丢弃。  
    if((tcsetattr(fd,TCSANOW,&newtio))!=0) 
    {  
       printf("串口初始化失败!!\n");  
       exit(1);  
    }  
 
    printf("串口初始化成功，请输入参数测试!!\n");  
 
	while (1)  
	{   
        	nread = read(fd, buf1, 100);  
        	if(nread > 0)
            {  
            		printf("输入参数为= %s\n", buf1);
                    int retvalue = write(fd, buf1, sizeof(buf1));
                    printf("请再次输入参数测试!!\n");
                    memset(buf1, 0, sizeof(buf1));  
        	}  
        	sleep(1);  
    }  
 
    close(fd);  
    
	return 0;
}
 
